package com.tp2.dominio;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.tp2.bo.Oferta;
import com.tp2.dao.ParserCupones;

public class CalculadorDeDescuentos {
	
	private static CalculadorDeDescuentos calculador;
	private Calendario calendario;
	private ParserCupones parserCupones;

	private CalculadorDeDescuentos(){
		
		calendario = Calendario.getInstance();
		this.parserCupones = new ParserCupones();
		
	}
		
	public static CalculadorDeDescuentos getInstance(){
		
		if (calculador == null){
			calculador = new CalculadorDeDescuentos();
		}
		
		return calculador;
		
	}

	public List<Descuento> aplicarOfertas(List<Producto> productos, MedioDePago medioDePago, TarjetaDescuento tarjetaDescuento) {
		
		List<Descuento> descuentos = new ArrayList<Descuento>();
				
		List<Oferta> ofertasVigentesHoy = calendario.dameOfertasVigentes();
		
		ordenarOfertas(ofertasVigentesHoy);
		
		for(Oferta oferta: ofertasVigentesHoy){			
			
			if(!oferta.generaCupon())
				descuentos.addAll(oferta.aplicar(productos, medioDePago, tarjetaDescuento));
				
		}
		
		return descuentos;
	}
	
	public List<CuponDescuento> generarCupones(List<Producto> productos, MedioDePago medioDePago, TarjetaDescuento tarjetaDescuento){
		
		List<Descuento> descuentos = new ArrayList<Descuento>();
		
		List<Oferta> ofertasVigentesHoy = calendario.dameOfertasVigentes();
		
		ordenarOfertas(ofertasVigentesHoy);
		
		for(Oferta oferta: ofertasVigentesHoy){			
			
			if(oferta.generaCupon())
				descuentos.addAll(oferta.aplicar(productos, medioDePago, tarjetaDescuento));
				
		}		
		
		List<CuponDescuento> cupones = new ArrayList<CuponDescuento>();
		
		for(Descuento descuento: descuentos){
			
				CuponDescuento cupon = new CuponDescuento(descuento.getMonto(), 20.00, descuento.getDescripcion());
				
				actualizarCupones(cupones,cupon);
										
		}
			
		return cupones;
	
	}
	
	
	private void ordenarOfertas(List<Oferta> ofertas){
		
		Collections.sort(ofertas);
	}
	
	private void actualizarCupones(List<CuponDescuento> cupones,CuponDescuento cuponAAgregar){
		
		for (CuponDescuento cupon: cupones){
			
			if(cupon.getDescripcion().equals(cuponAAgregar.getDescripcion())){
				
				cupon.setImporte(cupon.getImporte() + cuponAAgregar.getImporte());
				return;
				
			}
			
		}
				
		cupones.add(cuponAAgregar);	
	}
	
}
